package com.zyf.project.capchain.utils.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

import java.util.concurrent.TimeUnit;

/**
 * <h1>Redis 键枚举类</h1>
 * <h2>Redis Key 命名风格</h2>
 * <ul>
 *     <li><b>【推荐】</b>Redis key命名需具有可读性以及可管理性，不该使用含义不清的key以及特别长的key名</li>
 *     <li><b>【强制】</b>以英文字母开头，命名中只能出现小写字母、数字、英文点号(.)和英文半角冒号(:)</li>
 *     <li><b>【强制】</b>不要包含特殊字符，如下划线、空格、换行、单双引号以及其他转义字符</li>
 * </ul>
 * <h2>命名规范</h2>
 * <b>【强制】</b>命名规范：<b><i>业务模块名:业务逻辑含义:其他:value类型</i></b>
 * <ol>
 *     <li><b>业务模块名</b>：具体的功能模块</li>
 *     <li>
 *         <b>逻辑含义段</b>：
 *         <ul>
 *             <li><b>【强制】</b>不同业务逻辑含义使用英文半角冒号(:)分割</li>
 *             <li><b>【强制】</b>同一业务逻辑含义段的单词之间使用英文半角点号 (.)分割，用来表示一个完整的语义</li>
 *         </ul>
 *     </li>
 *     <li>
 *         <b>value类型</b>：
 *         <ul><li><b>【强制】</b>Redis key命名以key所代表的value类型结尾，以提高可读性</li></ul>
 *     </li>
 * </ol>
 * <h2>value 设计</h2>
 * <p><b>【强制】</b>：拒绝 bigkey (防止网卡流量、慢查询)。<br></p>
 * <p>String类型控制在10KB以内，Hash、List、Set、ZSet元素个数不要超过5000。</p>
 *
 * @author Zhou Yifan
 */
@Getter
@ToString
@AllArgsConstructor
public enum RedisKeyConstant {

    /**
     * 用户登陆注册成功数据缓存
     */
    USER_LOGIN_AND_SIGNUP_SUCCESS(
            "capchain.user:login.signup:success:hash.userdto",
            "用户登陆注册成功数据缓存",
            2, TimeUnit.HOURS),

    /**
     * 用户登陆注册失败数据缓存，用于解决缓存穿透问题，不过目前的策略是用户不存在时自动注册，所以可能暂时用不到
     */
    USER_LOGIN_AND_SIGNUP_FAILED(
            "capchain.user:login.signup:failed:hash.userdto",
            "用户登陆注册失败数据缓存，用于解决缓存穿透问题",
            5, TimeUnit.MINUTES),

    ;
    /**
     * 键名
     */
    private final String key;

    /**
     * 描述
     */
    private final String disc;

    /**
     * 过期时间，单位：TimeUnit
     */
    private final Integer expire;

    /**
     * 过期时间单位
     */
    private final TimeUnit unit;
}
